﻿#ifndef HGUI_H_INCLUDED
#define HGUI_H_INCLUDED

#include <windows.h>

const wchar_t* charToWchar(const char * buf){
  	int len = MultiByteToWideChar(CP_UTF8, 0, buf, -1, 0, 0);

	wchar_t res[1024];
	MultiByteToWideChar(CP_UTF8, 0, buf, -1, res, len);

	return res;
}

int MakeTooltipWindow(lua_State* l) {
    IGUIWindow* wnd = P.GUI->addWindow(rect<int>(10,10,400,400), false, L"Подсказка");
    P.Tooltip = P.GUI->addStaticText(charToWchar("Hello"),rect<int>(5,20,385,360), false, true, wnd);
    wnd->setVisible(false);

    uint id = P.GUIElements.size();
    P.GUIElements.push_back(wnd);

    lua_pushnumber(l, id);

	return 1;
}

int SetTooltip(lua_State* l) {
	if (!lua_gettop(l) || !isstr(1)) { lua_pop(l, 1); return LOG_ERROR("SetTooltip: no parameters found!"); }
	if (isstr(1)) P.Tooltip->setText(charToWchar(tostr(1)));
	return 0;
}

/* SetFont(string file) */
int SetFont(lua_State* l) {
	if (!lua_gettop(l) || !isstr(1)) { lua_pop(l, 1); return LOG_ERROR("SetTooltip: no parameters found!"); }
	P.GUI->getSkin()->setFont(
		P.GUI->getFont(tostr(1))
	);

	lua_pop(l, 1);

	return 0;
}

/* AddStaticText(string text, uint left, uint up, uint right, uint down, bool border) */
int AddStaticText(lua_State* l) {
	uint n = lua_gettop(l);
	bool border = false;
	const char* text;
	recti field = recti(0,0,300,12);
	if (n >= 1 && isstr(1)) text = tostr(1);
	if (n >= 2 && isnum(2)) field.UpperLeftCorner.X = tonum(2);
	if (n >= 3 && isnum(3)) field.UpperLeftCorner.Y = tonum(3);
	if (n >= 4 && isnum(4)) field.LowerRightCorner.X = tonum(4);
	if (n >= 5 && isnum(5)) field.LowerRightCorner.Y = tonum(5);
	if (n == 6 && isbool(6)) border = tobool(6);

	int id = P.GUIElements.size();

	IGUIStaticText* element = P.GUI->addStaticText(charToWchar(text), field, border, true, 0, id);

	P.GUIElements.push_back(element);

	lua_pushnumber(l, id);

	return 1;
}

/* Splash(string file) */
int Splash(lua_State* l) {
	if (!lua_gettop(l) || !isstr(1)) { lua_pop(l, 1); return -1; }

	dimension2du window_resolution = P.Driver->getScreenSize();

	int id = P.GUIElements.size();

	IGUIImage * loadingScreen = P.GUI->addImage(
		P.Driver->getTexture(tostr(1)),position2di(0,0), id);//фоновая картинка
	loadingScreen->setMaxSize(window_resolution);   // масшабирую картинку под разрешение экрана
	loadingScreen->setScaleImage(true);

	P.GUIElements.push_back(loadingScreen);

	lua_pushnumber(l, id);

	printf("Created splash with id: %d\n", id);

	return 1;
}

int MoveSplash(lua_State* l) {
	uint n = lua_gettop(l), id;
	if (!n) return -1;
	int x, y;
	if (n >= 1 && isnum(1)) id = tonum(1);
	if (n >= 2 && isnum(2)) x = tonum(2);
	if (n == 3 && isnum(3)) y = tonum(3);
	if (id >=0 && id < P.GUIElements.size())
		P.GUIElements[id]->move(position2di(x,y));
	return 0;
}

/* RemoveGUIElement(uint id) */
int RemoveGUIElement(lua_State* l) {
	if (!lua_gettop(l) || !isnum(1)) { return LOG_ERROR("RemoveGUIElement: first parameter must be number - id!"); }
	uint id = tonum(1);
	if (id >= 0 && id < P.GUIElements.size()) {
		P.GUIElements[id]->remove();
		P.GUIElements[id] = nullptr;
		printf("GUIElement with id %d deleted\n", id);
	} else {
		printf("RemoveGUIElement: cant delete element with id %d\n", id);
	}

	return 0;
}

/* HideGUIElement(uint id) */
int HideGUIElement(lua_State* l) {
	if (!lua_gettop(l) || !isnum(1)) { return LOG_ERROR("HideGUIElement: first parameter must be number - id!"); }
	uint id = tonum(1);
	if (id >= 0 && id < P.GUIElements.size())
		P.GUIElements[id]->setVisible(false);
	return 0;
}

/* ShowGUIElement(uint id) */
int ShowGUIElement(lua_State* l) {
	if (!lua_gettop(l) || !isnum(1)) { return LOG_ERROR("ShowGUIElement: first parameter must be number - id!"); }
	uint id = tonum(1);
	if (id >= 0 && id < P.GUIElements.size())
		P.GUIElements[id]->setVisible(true);
	return 0;
}

void initGuiFuncs() {
	REG(AddStaticText);
	REG(Splash);
   	REG(RemoveGUIElement);
   	REG(SetFont);
   	REG(MoveSplash);
   	REG(HideGUIElement);
   	REG(ShowGUIElement);
   	REG(MakeTooltipWindow);
   	REG(SetTooltip);
}

#endif // HGUI_H_INCLUDED
